#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
飞书授权助手
模仿JavaScript代码实现获取授权码的逻辑
"""

import urllib.parse
import webbrowser
from typing import Optional
from config import Config


def handle_feishu_auth(redirect_url: Optional[str] = None, 
                      scope: Optional[str] = None,
                      response_type: str = "code") -> str:
    """
    处理飞书授权 - 模仿JavaScript代码结构
    
    Args:
        redirect_url: 重定向URL，如果不提供则使用配置文件中的默认值
        scope: 权限范围，如果不提供则使用默认的多维表格权限
        response_type: 响应类型，默认为"code"
    
    Returns:
        str: 授权URL
    """
    # 获取配置
    config = Config()
    
    # 飞书应用的App ID
    app_id = config.CLIENT_ID  # 替换为实际的飞书应用App ID
    
    # 授权重定向URI，需要在飞书开放平台配置
    if redirect_url is None:
        redirect_url = config.REDIRECT_URI
    redirect_uri = urllib.parse.quote(redirect_url, safe='')
    
    # 授权类型和权限范围
    if scope is None:
        # 默认使用多维表格相关权限
        scope = "contact:read:user,contact:read:group"
    
    # 构建授权URL
    auth_url = f"https://open.feishu.cn/open-apis/authen/v1/index?app_id={app_id}&redirect_uri={redirect_uri}&response_type={response_type}&scope={scope}"
    
    return auth_url


def open_feishu_auth_page(redirect_url: Optional[str] = None, 
                         scope: Optional[str] = None,
                         response_type: str = "code") -> str:
    """
    打开飞书授权页面 - 完整的授权流程
    
    Args:
        redirect_url: 重定向URL
        scope: 权限范围
        response_type: 响应类型
    
    Returns:
        str: 授权URL
    """
    # 获取授权URL
    auth_url = handle_feishu_auth(redirect_url, scope, response_type)
    
    print(f"🔗 授权URL: {auth_url}")
    print("\n📋 授权信息:")
    
    config = Config()
    print(f"   App ID: {config.CLIENT_ID}")
    print(f"   重定向URI: {redirect_url or config.REDIRECT_URI}")
    print(f"   权限范围: {scope or config.DEFAULT_SCOPE}")
    print(f"   响应类型: {response_type}")
    
    # 跳转到飞书授权页面（在Python中使用webbrowser模块）
    try:
        print("\n🌐 正在打开浏览器...")
        webbrowser.open(auth_url)
        print("✅ 浏览器已打开，请在浏览器中完成授权")
    except Exception as e:
        print(f"❌ 无法自动打开浏览器: {e}")
        print("请手动复制上面的授权URL到浏览器中打开")
    
    return auth_url


def get_auth_code_url_params() -> dict:
    """
    获取构建授权URL所需的参数
    
    Returns:
        dict: 包含所有授权参数的字典
    """
    config = Config()
    
    return {
        'app_id': config.CLIENT_ID,
        'redirect_uri': config.REDIRECT_URI,
        'response_type': 'code',
        'scope': 'bitable:app:readonly bitable:app:write offline_access',
        'base_url': 'https://open.feishu.cn/open-apis/authen/v1/index'
    }


def build_auth_url_manual(app_id: str, 
                         redirect_uri: str, 
                         scope: str = "bitable:app:readonly bitable:app:write offline_access",
                         response_type: str = "code") -> str:
    """
    手动构建授权URL - 提供更多自定义选项
    
    Args:
        app_id: 飞书应用ID
        redirect_uri: 重定向URI
        scope: 权限范围
        response_type: 响应类型
    
    Returns:
        str: 完整的授权URL
    """
    # URL编码重定向URI
    encoded_redirect_uri = urllib.parse.quote(redirect_uri, safe='')
    
    # 构建参数
    params = {
        'app_id': app_id,
        'redirect_uri': encoded_redirect_uri,
        'response_type': response_type,
        'scope': scope
    }
    
    # 构建查询字符串
    query_string = urllib.parse.urlencode(params)
    
    # 返回完整URL
    return f"https://open.feishu.cn/open-apis/authen/v1/index?{query_string}"


def print_auth_instructions():
    """
    打印授权说明
    """
    config = Config()
    
    print("\n" + "="*60)
    print(" 飞书授权说明")
    print("="*60)
    
    print("\n📋 当前配置:")
    print(f"   App ID: {config.CLIENT_ID}")
    print(f"   重定向URI: {config.REDIRECT_URI}")
    print(f"   权限范围: bitable:app:readonly bitable:app:write offline_access")
    
    print("\n🔧 使用方法:")
    print("   1. 调用 handle_feishu_auth() 获取授权URL")
    print("   2. 调用 open_feishu_auth_page() 直接打开授权页面")
    print("   3. 用户在浏览器中完成授权")
    print("   4. 授权成功后会重定向到配置的回调URL")
    print("   5. 从回调URL中提取授权码(code参数)")
    
    print("\n⚠️  注意事项:")
    print("   - 确保在飞书开发者后台配置了正确的重定向URL")
    print("   - 授权码有效期为5分钟，且只能使用一次")
    print("   - 需要确保应用已申请相应的API权限")
    
    print("\n🔗 相关链接:")
    print("   - 飞书开放平台: https://open.feishu.cn/")
    print("   - 故障排除指南: TROUBLESHOOTING.md")


if __name__ == "__main__":
    # 示例用法
    print("🚀 飞书授权助手示例")
    
    # 打印说明
    print_auth_instructions()
    
    print("\n" + "-"*60)
    print(" 示例1: 获取授权URL")
    print("-"*60)
    
    # 方法1: 使用默认配置
    auth_url = handle_feishu_auth()
    print(f"\n授权URL: {auth_url}")
    
    print("\n" + "-"*60)
    print(" 示例2: 自定义权限范围")
    print("-"*60)
    
    # 方法2: 自定义权限范围
    custom_scope = "contact:read:user contact:read:group bitable:app:readonly"
    custom_auth_url = handle_feishu_auth(scope=custom_scope)
    print(f"\n自定义权限授权URL: {custom_auth_url}")
    
    print("\n" + "-"*60)
    print(" 示例3: 手动构建授权URL")
    print("-"*60)
    
    # 方法3: 完全手动构建
    config = Config()
    manual_url = build_auth_url_manual(
        app_id=config.CLIENT_ID,
        redirect_uri=config.REDIRECT_URI,
        scope="bitable:app:readonly bitable:app:write offline_access"
    )
    print(f"\n手动构建的授权URL: {manual_url}")
    
    print("\n" + "-"*60)
    print(" 示例4: 获取URL参数")
    print("-"*60)
    
    # 方法4: 获取参数用于其他用途
    params = get_auth_code_url_params()
    print("\n授权URL参数:")
    for key, value in params.items():
        print(f"   {key}: {value}")
    
    print("\n\n💡 提示: 运行 open_feishu_auth_page() 可以直接打开授权页面")